pro Landsat_FLAASH_LC8,Path,ENVIFileName

  COMPILE_OPT idl2
  e=envi(/HEADLESS)

  ;获取源码所在文件
  ;  ;Path = FILE_DIRNAME(ROUTINE_FILEPATH())+PATH_SEP()

  ;  Path ="F:\LC08data\LC08_L1TP_135026_20181208_20181211_01_T1\"
  ;  ENVIFileName="LC08_L1TP_135026_20181208_20181211_01_T1"


  ;输入多光谱辐射亮度数据
  radiance_file=file_search(Path,ENVIFileName+'_rad_BIL.dat', COUNT=nCount,$
    /TEST_READ, /FULLY_QUALIFY_PATH)

  ;  radiance_file = FILEPATH('P115R049_LC8D20180518_rad_BIL.dat', $
  ;    root_dir=Path, subdirectory=['data'])

  ;大气校正输出结果文件路径
  if file_test(Path+'output', /directory) eq 0 then begin
    file_mkdir,Path+'output'
  endif

  reflect_file = FILEPATH(ENVIFileName+'_rad_flaash.dat', $
    root_dir=Path, subdirectory=['output'])

  ;打开栅格数据，获取元数据信息
  radiance_file = 'D:\Lgz\out\LC08_L1TP_120038_20131201_20170428_01_T1_MTL_rad_BIL.dat'
  raster = e.OpenRaster(radiance_file)

  ;数据信息
  nspatial = raster.nColumns   ;����
  nlines = raster.nRows        ;����
  fid = ENVIRasterToFID(raster)
  ENVI_FILE_QUERY, fid, data_type=data_type  ;��������

  ;获取输入文件后缀 (.dat)
  exten = stregex(radiance_file, '\..+$', /extract)
  ;对应 Rootname for FLAASH files 参数，设置为 Landsat_8_OLI_Rad_
  user_stem_name = FILE_BASENAME(radiance_file, exten)+'_'

  ;对应 Output Directory for FLAASH Files 参数
  ;使用输出路径作为临时路径（不建议使用系统临时路径）
  modtran_directory = Path+"output"

  ;获取光谱响应函数路径
  filter_func_filename = FILEPATH('landsat8_oli.sli', $
    root_dir=e.root_dir, subdirectory=['resource','filterfuncs'])

  ;获取时间信息
  ;如果元数据中有时间信息，则自动获取
  tmpTimes = STRSPLIT(raster.Time.ACQUISITION, '-T:Z', /extract)
  year = FIX(tmpTimes[0])
  month = FIX(tmpTimes[1])
  day = FIX(tmpTimes[2])
  gmt = DOUBLE(tmpTimes[3]) + $
    DOUBLE(tmpTimes[4])/60D + DOUBLE(tmpTimes[5])/60D^2


  ;坐标信息
  ref = raster.SPATIALREF
  ;如果有坐标系，则自动获取经纬度、分辨率
  pixel_size = (ref.pixel_size)[0]
  ref.ConvertFileToMap, nspatial/2, nlines/2, MapX, MapY
  ref.ConvertMapToLonLat, MapX, MapY, longitude, latitude


  ;获取波长信息
  metadata = Raster.Metadata
  wavelength_units = metadata['WAVELENGTH UNITS']
  lambda = metadata['WAVELENGTH']
  ;fwhm如果没有，可设置值全部为-1，
  ;例如4个波段的多光谱数据，设置为[-1.0, -1.0, -1.0, -1.0]
  fwhm = metadata['FWHM']
  ;缩放系数，如果定标时设置了FLAASH Setting，则设置value=1.0即可。
  input_scale = MAKE_ARRAY(raster.nbands, value=1.0, /double)

 ;初始化FLAASH对象
  ;可选关键字如下：
  ; rad_remove FLAASH执行完毕后，自动关闭输入文件
  ; anc_remove FLAASH执行完毕后，自动关闭生成的辅助数据
  ; anc_delete FLAASH执行完毕后，自动关闭并删除辅助数据
  flaash_obj = obj_new('flaash_batch', /anc_delete)

  ;设置大量的输入参数
  flaash_obj->SetProperty, $
    hyper = 0, $  ;设置为1，表示高光谱；设置为0，表示多光谱
 ; FLAASH工程参数----
    radiance_file = radiance_file, $
    reflect_file = reflect_file, $
    filter_func_filename = filter_func_filename, $
    filter_func_file_index = 0, $
    water_band_choice = 1.13, $
    red_channel = 4, $   ;0表示undefined，LC8红波段为第4波段
    green_channel = 3, $ ;0表示undefined，LC8绿波段为第3波段
    blue_channel = 2, $  ;0表示undefined，LC8蓝波段为第2波段

     ;水汽反演，没有所需波段，所以设置为0，表示undefined
    ;分别对应Multispectral Setting中Water Retrieval选项卡中的两个参数
    water_retrieval = 0, $  ;Water Retrieval参数。0表示No，1表示Yes
    water_abs_channel = 0, $
    water_ref_channel = 0, $

    ;气溶胶反演----
    ;对应Multispectral Setting中Kaufman-Tanre Aerosol Retrieval选项卡中的参数
    kt_upper_channel = 7, $ ;设置短波红外2（SWIR 2）
    kt_lower_channel = 4, $ ;设置红波段（Red）
    kt_cutoff = 0.08, $ ;Maximum Upper Channel Reflectance
    kt_ratio = 0.500, $ ;Reflectance Ratio
    cirrus_channel = 0, $   ;0表示undefined

     ;前边已经定义
    user_stem_name = user_stem_name, $
    modtran_directory = modtran_directory, $
    ; MODTRAN参数---
    visvalue = 40.0000, $ ;�ܼ��ȣ�Ĭ��40km

     ;为了进行水汽反演，需要如下3个波段范围中的一个：
    ; 1050-1210nm, 770-870nm, 870-1020nm
    ; 而且要求此范围的波段光谱分辨率最低为15nm
    f_resolution = 15.0000, $

     ;时间信息----
    day = day, $
    month = month, $
    year = year, $
    gmt = gmt, $
    latitude = latitude, $
    longitude = longitude, $
    sensor_altitude = 705.0000, $  ;传感器高度
    ground_elevation = 0.043, $ ;平均海拔，单位km

     ;分别对应 Advanced Setting 中的同名参数，默认即可
    view_zenith_angle = 180.0000, $
    view_azimuth = 0.0000, $

     ;大气模型：0-SAW；1-MLW；2-U.S. Standard；3-SAS；4-MLS；5-T
    atmosphere_model = 4, $
    ;气溶胶模型：0-No Aerosol；1-Rural；2-Maritime；3-Urban；4-Tropospheric
    aerosol_model = 3, $

     ;如下几个参数对应 Advanced Setting同名参数，默认即可。
    multiscatter_model = 0, $
    disort_streams = 8, $
    co2mix = 390.0000, $
    water_column_multiplier = 1.0000, $
     ;图像参数
    nspatial = nspatial, $
    nlines = nlines, $
    data_type = data_type, $
    margin1 = 0, $
    margin2 = 0, $
    nskip = 0, $
    pixel_size = pixel_size, $
    sensor_name = 'Landsat-8 OLI', $

     ;分析参数----
    ;对应Advanced Setting中的 Aerosol Scale Height
    aerosol_scaleht = 2.0000, $
     ;对应Advanced Setting中的 Use Adjacency Correction
    ;中高分辨率设置为1，低分辨率（如Modis）设置为0
    use_adjacency = 1, $

     ;输出缩放系数，输出结果放大了10000倍，变为UINT数据类型。
    ;对应Advanced Setting中的Output Reflectance Scale Factor
    output_scale = 10000.0000, $ ;输出结果缩放系数

     ;对应 Width (number of bands) 参数，多光谱设置0即可。
    polishing_res = 0, $

     ;对应 Aerosol Retrieval 参数。
    ; 0 表示 None；1 表示 2-Band (K-T)；2 表示 2-Band Over Water
    aerosol_retrieval = 1, $

     ;对应FLAASH面板中的 Wavelength Recalibration，多光谱一般为0
    calc_wl_correction = 0, $
    reuse_modtran_calcs = 0, $
    use_square_slit_function = 0, $
    convolution_method = 'fft', $

     ;对应Advanced Setting中的 Use Tiled Processing
    ;1-Yes；0-No
    use_tiling = 0, $
    tile_size = 1024.0000, $

    ; Spectral Parameters
    wavelength_units = wavelength_units, $
    lambda = lambda, $
    fwhm = fwhm, $
    input_scale = input_scale

    ;重要！！！！！！重要！！！！！！重要！！！！！
  ;执行FLAASH之前，必须在ENVI中把输入文件关闭
  Raster.Close

   ;开始执行FLAASH
  flaash_obj->processImage

   ;获取输入输出文件的FID
  flaash_obj->getResults, rad_fid=rad_fid, reflect_fid=reflect_fid

  ENVI_FILE_MNG, ID = rad_fid, /REMOVE
  ENVI_FILE_MNG, ID = reflect_fid, /REMOVE


  FILE_COPY,Path+'output\'+ENVIFileName+'_rad_flaash.dat',Path+ENVIFileName+'_rad_flaash.dat'
  FILE_COPY,Path+'output\'+ENVIFileName+'_rad_flaash.hdr',Path+ENVIFileName+'_rad_flaash.hdr'
  FILE_DELETE, Path+'output',/RECURSIVE
  
  ; Close the ENVI session
  e.Close

  ; ENVI.Close
END


